/* $Id: bitmap.h,v 1.3 2006-10-23 17:30:55 nicolasw Exp $ */

#ifndef BITMAP_H
#define BITMAP_H

/* Bitmap para representar conjunto de enteros. Basado en un codigo C++ por 
 * Nicolas Wolovick. Escrito por Rafael Carrascosa para la catedra de Sistemas
 * Operativos, FaMAF, UNC.
 * Eres libre de modificar,utilizar y distribuir este codigo para cualquier 
 * fin siempre y cuando mantengas la autoria intacta.
 */

#include <stddef.h>
#include <stdbool.h>

typedef struct bitmap_s bitmap_s;

/*
 * TAD que implementa un conjunto de enteros con un bitmap. Los
 * elementos del conjunto son representados con numeros enteros en
 * [0..size-1] donde size es una parametro de la creacion de una
 * instancia del TAD.
 * Por ejemplo: Se pueden preguntar cosas como "El 15 pertenece al
 * conjunto?" o se puede pedir "Agregue el 30 al conjunto".
 */

/*
 * Construye un bitmap que funciona como conjunto en el rango
 * [0..size-1].
 * EN caso de error devuelve NULL.
 * Notar que por razones de eficiencia puede que el rango efectivo
 * sobre el que trabaje el bitmap sea ligeramente mayor a size.
 * Esto significa que se podria insertar 11 en un bitmap con size 9
 * sin errores por parte del TAD. Es responsavilidad del usuario
 * utilizar el TAD en el rango correspondiente.
 */
bitmap_s *bitmap_create(size_t size);

/*
 * Libera los recursos ocupados por bitmap.
 */
void bitmap_destroy(bitmap_s *bitmap);

/*
 * Devuelve true si location pertenece al conjunto que representa
 * bitmap.
 * Devuelve false si location pertenece al conjunto que representa
 * bitmap.
 */
bool bitmap_member(const bitmap_s *bitmap,size_t location);

/*
 * Agrega el elemento location al conjunto que representa bitmap.
 * El comportamiento si el elemento ya pertenece es el mismo de un
 * conjunto.
 */
void bitmap_insert(bitmap_s *bitmap,size_t location);

/*
 * Saca el elemento location al conjunto que representa bitmap.
 * El comportamiento si el elemento no pertenece es el mismo de un
 * conjunto.
 */
void bitmap_remove(bitmap_s *bitmap,size_t location);

/*
 * Devuelve el cardinal del conjunto que representa bitmap.
 */
size_t bitmap_size(const bitmap_s *bitmap);

/*
 * Devuelve la cantidad maxima de elementos que podria haber en bitmap.
 */
size_t bitmap_capacity(const bitmap_s *bitmap);

/*
 * Devuelve true si no hay elementos en el conjunto representado por
 * bitmap.
 * Devuelve false si hay elementos en el conjunto representado por
 * bitmap.
 */
bool bitmap_empty(const bitmap_s *bitmap);

#endif /* BITMAP_H */
